package com.code.common.util;

import lombok.NoArgsConstructor;
import org.springframework.util.ObjectUtils;

import java.util.*;

/**
 * 集合工具类
 *
 * @author tangyifei
 */
@NoArgsConstructor(access = lombok.AccessLevel.PRIVATE)
public class CollectionUtil {

    /**
     * 判断集合是否为空
     *
     * @param collection 集合对象
     * @return 是否为空判断结果
     */
    public static boolean isEmpty(Collection<?> collection) {
        return null == collection || collection.isEmpty();
    }

    /**
     * 判断集合是否为非空
     *
     * @param collection 集合对象
     * @return 是否为非空判断结果
     */
    public static boolean isNotEmpty(Collection<?> collection) {
        return !isEmpty(collection);
    }

    /**
     * 判断map是否为空
     *
     * @param map map对象
     * @return 是否为空判断结果
     */
    public static boolean isEmpty(Map<?, ?> map) {
        return null == map || map.isEmpty();
    }

    /**
     * 判断map是否为非空
     *
     * @param map map对象
     * @return 是否为非空判断结果
     */
    public static boolean isNotEmpty(Map<?, ?> map) {
        return !isEmpty(map);
    }

    /**
     * 判断某一个迭代对象是否有某一个元素
     *
     * @param iterator 迭代器对象
     * @param element  包含的元素
     * @return 是否包含的判断结果
     */
    public static boolean contains(Iterator<?> iterator, Object element) {
        if (null != iterator) {
            while (iterator.hasNext()) {
                Object candidate = iterator.next();
                if (ObjectUtils.nullSafeEquals(candidate, element)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * 返回a-b的新List.
     */
    public static <T> List<T> subtract(final Collection<T> a, final Collection<T> b) {
        List<T> list = new ArrayList<>(a);
        for (T element : b) {
            list.remove(element);
        }

        return list;
    }

    /**
     * 返回a与b的交集的新List.
     */
    public static <T> List<T> intersection(Collection<T> a, Collection<T> b) {
        List<T> list = new ArrayList<>();

        for (T element : a) {
            if (b.contains(element)) {
                list.add(element);
            }
        }
        return list;
    }
}
